home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / Utilities / Calc / lib / deg.cal < prev    next >
Encoding:
Text File  |  1992-02-24  |  2.2 KB  |  126 lines  |  [TEXT/????]

  1. /*
  2.  * Copyright (c) 1992 David I. Bell
  3.  * Permission is granted to use, distribute, or modify this source,
  4.  * provided that this copyright notice remains intact.
  5.  *
  6.  * Calculate in degrees, minutes, and seconds.
  7.  */
  8.  
  9. obj dms {deg, min, sec};
  10.  
  11. define dms(deg, min, sec)
  12. {
  13.     local ans;
  14.  
  15.     if (isnull(sec))
  16.         sec = 0;
  17.     if (isnull(min))
  18.         min = 0;
  19.     obj dms ans;
  20.     ans.deg = deg;
  21.     ans.min = min;
  22.     ans.sec = sec;
  23.     fixdms(&ans);
  24.     return ans;
  25. }
  26.  
  27.  
  28. define dms_add(a, b)
  29. {
  30.     local ans;
  31.  
  32.     obj dms    ans;
  33.     ans.deg = 0;
  34.     ans.min = 0;
  35.     ans.sec = 0;
  36.     if (istype(a, ans)) {
  37.         ans.deg += a.deg;
  38.         ans.min += a.min;
  39.         ans.sec += a.sec;
  40.     } else
  41.         ans.deg += a;
  42.     if (istype(b, ans)) {
  43.         ans.deg += b.deg;
  44.         ans.min += b.min;
  45.         ans.sec += b.sec;
  46.     } else
  47.         ans.deg += b;
  48.     fixdms(&ans);
  49.     return ans;    
  50. }
  51.  
  52.  
  53. define dms_neg(a)
  54. {
  55.     local ans;
  56.  
  57.     obj dms ans;
  58.     ans.deg = -ans.deg;
  59.     ans.min = -ans.min;
  60.     ans.sec = -ans.sec;
  61.     return ans;
  62. }
  63.  
  64.  
  65. define dms_sub(a, b)
  66. {
  67.     return a - b;
  68. }
  69.  
  70.  
  71. define dms_mul(a, b)
  72. {
  73.     local ans;
  74.  
  75.     obj dms ans;
  76.     if (istype(a, ans) && istype(b, ans))
  77.         quit "Cannot multiply degrees together";
  78.     if (istype(a, ans)) {
  79.         ans.deg = a.deg * b;
  80.         ans.min = a.min * b;
  81.         ans.sec = a.sec * b;
  82.     } else {
  83.         ans.deg = b.deg * a;
  84.         ans.min = b.min * a;
  85.         ans.sec = b.sec * a;
  86.     }
  87.     fixdms(&ans);
  88.     return ans;
  89. }
  90.  
  91.  
  92. define dms_print(a)
  93. {
  94.     print a.deg : 'd' : a.min : 'm' : a.sec : 's' :;
  95. }
  96.  
  97.  
  98. define dms_abs(a)
  99. {
  100.     return a.deg + a.min / 60 + a.sec / 3600;
  101. }
  102.  
  103.  
  104. define fixdms(a)
  105. {
  106.     a.min += frac(a.deg) * 60;
  107.     a.deg = int(a.deg);
  108.     a.sec += frac(a.min) * 60;
  109.     a.min = int(a.min);
  110.     a.min += a.sec // 60;
  111.     a.sec %= 60;
  112.     a.deg += a.min // 60;
  113.     a.min %= 60;
  114.     a.deg %= 360;
  115. }
  116.  
  117. global lib_debug;
  118. if (!isnum(lib_debug) || lib_debug>0) print "obj dms {deg, min, sec} defined"
  119. if (!isnum(lib_debug) || lib_debug>0) print "dms(deg, min, sec) defined"
  120. if (!isnum(lib_debug) || lib_debug>0) print "dms_add(a, b) defined"
  121. if (!isnum(lib_debug) || lib_debug>0) print "dms_neg(a) defined"
  122. if (!isnum(lib_debug) || lib_debug>0) print "dms_sub(a, b) defined"
  123. if (!isnum(lib_debug) || lib_debug>0) print "dms_mul(a, b) defined"
  124. if (!isnum(lib_debug) || lib_debug>0) print "dms_print(a) defined"
  125. if (!isnum(lib_debug) || lib_debug>0) print "dms_abs(a) defined"
  126.